<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <meta name="Page-topic" content="ST-Open - Weichwaren" />
 <meta name="Description" content="ST-Open - Weichwaren" />
 <meta name="Keywords" content="ST-Open Weichwaren, Open Quelle, ST-Open, Weichwaren, Bibliothek, Bibliotheken, freie Weichwaren, Assembler, C" />
 <meta name="date" content="2009-05-08T00:00:00+00:00" />
 <meta name="robots" content="index,follow" />
 <meta name="revisit-after" content="14 days" />
 <meta name="generator" content="Bernhard Schornak, handwritten" />
 <style type="text/css"><!--@import "../../st.css";--></style>
 <link rel="SHORTCUT ICON" href="../../../../pics/favicon.ico" />
 <title>System-Speicher</title>
</head>
<body id="top">
<div class="pagehd">
<div id="menu">
<ul>
 <li><a href="../../../index.htm">Weichwaren</a></li>
 <li><a href="../tut/index.htm">Tutorials</a></li>
 <li><a href="../index.htm">Dokumentation</a></li>
 <li><a href="../alp.htm">alphabetisch</a></li>
 <li><a href="../fct.htm">nach Funktion</a></li>
</ul>
</div>
<div class="update">[2009-05-08]</div>
<div class="headpc"><img src="../../pics/ste.png" alt="QuelleDoc Logo" width="75" height="75" border="0" /></div>
</div>
<div class="crlf1"></div>
&#160;&#160;&#160;<a href="index.htm"><img src="../../../../pics/nav_up.png" alt="aufw&auml;rts" width="20" height="20" border="0" title="aufw&auml;rts" /></a>
&#160;&#160;&#160;<a href="0200.htm"><img src="../../../../pics/nav_bk.png" alt="zur&uuml;ck" width="20" height="20" border="0" title="zur&uuml;ck" /></a>
&#160;&#160;&#160;<a href="0400.htm"><img src="../../../../pics/nav_fw.png" alt="vorw&auml;rts" width="20" height="20" border="0" title="vorw&auml;rts" /></a>
&#160;&#160;&#160;<a href="FFFF.htm">Glossar</a>
<div class="crlf1"></div>
<div class="text100">
<h1>Globale Variablen</h1>
Wie im letzten Tutorial bereits angesprochen, gibt es zwei Speicherbereiche in BNR, in denen
 globale Variablen gespeichert werden k&ouml;nnen. Der Bereich 0x0000 bis 0x1FFF stellt 1.920
 statische Variablen zur Verf&uuml;gung. Diese werden beim Beenden des Programms in der Datei
 <i>FFFFFFFE</i> im Ordner DATA des Programms gespeichert. Der zweite Bereich stellt weitere
 8.192 Laufzeitvariablen zur Verf&uuml;gung, die beim Beenden des Programms jedoch verloren
 gehen.
<div class="crlf1"></div>
 Da nicht jede globale Variable permanent verf&uuml;gbar sein muss, sind die fl&uuml;chtigen
 Variablen z.B. n&uuml;tzlich, um darin Speicherhenkel, Fensterhenkel und &auml;hnliche Daten
 abzulegen, die sich bei jedem Programmstart &auml;ndern, oder wenn einige Programmpunkte ein
 festgelegtes Startverhalten aufweisen sollen, der durch den Wert Null in einer zugewiesenen
 Variablen signalisiert wird.
<div class="crlf1"></div>
<h2>Definition globaler Variablen</h2>
Die Definition globaler Variablen erfolgt normalerweise &uuml;ber den Abstand einer Variablen
 zur Basis <b>_BNR</b>. Hochsprachenkompilierer hingegen verstehen Abst&auml;nde zu einer
 gegebenen Basisadresse nur mit allerlei Zaubertricks (casting), die diesen einfachen Zugriff
 auf eine gegebene Variable durch mannigfaltige Kopieraktionen hoffnungslos verlangsamen und
 k&uuml;nstlich aufblasen.  Die mit Version 7.0.0. eingef&uuml;hrte Methode benutzte statt der
 Variablen <b>BNR</b> daher die Variable <b>GVAR</b> f&uuml;r Zugriffe auf Variablen. Der mit
 Version 8.0.0. erfolgte Umstieg auf 64 Bit macht eine Erweiterung dieser Behelfskr&uuml;cke
 auf zwei Variablen - <b>DVAR</b> und <b>QVAR</b> - n&ouml;tig. Die erste wird f&uuml;r den
 Zugriff auf Doppelworte, die zweite f&uuml;r den Zugriff auf Vierfachworte ben&ouml;tigt.
 Der Inhalt der beiden Kopfdateien ist identisch mit dem Inhalt der Assemblerkopfdatei, alle
 drei unterscheiden sich nur in der Komplexit&auml;t der Definition. <b>BNR</b> ist ein
 Vierfachwort, das eine Adresse (Zeiger auf Leer) enth&auml;lt, <b>DVAR</b> wurde als Zeiger
 auf <i>Lang</i> und <b>QVAR</b> als Zeiger auf <i>Langlang</i> definiert. Diese Definitionen
 bef&auml;higen den Hochsprachenkompilierer dann, aus <b>BNR</b> Doppel- oder Vierfachworte
 zu lesen. Da ein Hochsprachenkompilierer <b>DVAR</b> jedoch als <i>Doppelwortarray</i> und
 <b>QVAR</b> als <i>Vierfachwortarray</i> behandelt, und (sinnigerweise) alle Abst&auml;nde
 mit Vier oder Acht multipliziert, brauchen wir die Abst&auml;nde in den beiden Kopfdateien
 also nur noch durch Vier oder Acht teilen, um endlich auf eine der von uns adressierten
 Variablen zugreifen zu k&ouml;nnen:
<div class="crlf1"></div>
Als DVAR:
<div class="box100q"><pre>
  #define STV_HFRAME     ((DVAR) + (0x0000 &gt;&gt; 2))   /* Rahmenhenkel     */
  #define STV_HCLIENT    ((DVAR) + (0x0008 &gt;&gt; 2))   /* Klientenhenkel   */
  #define STV_SCREEN_W   ((DVAR) + (0x0010 &gt;&gt; 2))   /* Bildschirmbreite */
  #define STV_SCREEN_H   ((DVAR) + (0x0018 &gt;&gt; 2))   /* Bildschirmhoehe  */
  ...
</pre></div>
Als QVAR:
<div class="box100q"><pre>
  #define STV_HFRAME     ((QVAR) + (0x0000 &gt;&gt; 3))   /* Rahmenhenkel     */
  #define STV_HCLIENT    ((QVAR) + (0x0008 &gt;&gt; 3))   /* Klientenhenkel   */
  #define STV_SCREEN_W   ((QVAR) + (0x0010 &gt;&gt; 3))   /* Bildschirmbreite */
  #define STV_SCREEN_H   ((QVAR) + (0x0018 &gt;&gt; 3))   /* Bildschirmhoehe  */
  ...
</pre></div>
<div class="crlf1"></div>
Wenn Sie Ihre Variablen jemals in <i>FFFFFFFE</i> finden wollen, oder mir ein Programm zur
 Fehlersuche zu schicken gedenken, ist diese Form der Definition angeraten. Ich weigere mich
 schlicht und ergreifend, Arrayindizes in von Menschen lesbare Abst&auml;nde umzurechnen -
 das sollten Sie Sich ebenso wert sein!
<div class="crlf1"></div>
 Die Abst&auml;nde 0x0000 bis 0x01FF sowie 0x2000 bis 0x7FFF sind f&uuml;r die Funktionen der
 Bibliotheken reserviert. F&uuml;r Anwendungen verbleiben somit die Abst&auml;nde 0x0200 bis
 0x1FFF und 0x8000 bis 0xFFFF. Diese 10.112 Anwender-Variablen sollten eigentlich f&uuml;r
 jedes Programm ausreichen. Ben&ouml;tigen Sie noch mehr globale Variablen, w&auml;re es wohl
 sinnvoll, selbige in Ihren eigenen Feldern statt in den <i>Systemvariablen</i> zu speichern.
<div class="crlf1"></div>
Die in den Funktionen der Bibliotheken systemweit definierten Variablen sind in der Kopfdatei
 <b>..\ST8\include\yvar.h</b> zu finden. Globale Variablen f&uuml;r Ihr Programm sollten Sie
 in einer programmeigenen Kopfdatei (in ST-Open's Applikationen <b>hvar.h</b>) definieren, um
 den &Uuml;berblick zu behalten.
<div class="crlf1"></div>
<h2>Zugriff auf globale Variablen</h2>
<h3>1. Die langwierige Methode</h3>
Da die Variablen von 0x0000 bis 0x1FFF zum Datenfeld FFFFFFFE geh&ouml;ren, <i>kann</i> man
 mittels der Funktion FDacc() (ST-Open's Datenbankmaschine) darauf zugreifen. Das sollte man
 jedoch tunlichst bleiben lassen, da der direkte Zugriff wesentlich schneller und zudem auch
 einfacher ist. In der Zeit, in der die sechs Parameter f&uuml;r FDacc() auf dem Stapel
 abgelegt werden (Hochsprachenkompilierer verstehen kein <i>Intelligent Design</i>, in dem
 nicht ben&ouml;tigte Parameter auch nicht &uuml;bergeben werden m&uuml;ssen), ist bereits
 ein Direktzugriff ausgef&uuml;hrt und der zweite in Arbeit. Bis FDacc() abgearbeitet wurde,
 k&ouml;nnen sie schon zehn oder mehr Direktzugriffe ausgef&uuml;hrt haben.
<h3>2. Die einfache Methode</h3>
Dank der Verrenkungen bei der Definition gestaltet sich der Direktzugriff letztendlich doch
 relativ simpel:
<div class="box100q"><pre>
{
 DD x, *ea;

 /* Lesen:          */     x = *MEINE_VARIABLE;

 /* Schreiben:      */     *MEINE_VARIABLE = 10;
                           *DEINE_VARIABLE = 10;

 /* Addition:       */     *MEINE_VARIABLE += *DEINE_VARIABLE;

 /* Subtraktion:    */     *MEINE_VARIABLE -= *DEINE_VARIABLE;

 /* Multiplikation: */     *MEINE_VARIABLE *= *DEINE_VARIABLE;

 /* Division:       */     *MEINE_VARIABLE /= *DEINE_VARIABLE;

 /* Inkrementieren: */     *MEINE_VARIABLE++;

 /* Dekrementieren: */     *MEINE_VARIABLE--;

 /* Adresse:        */     ea = MEINE_VARIABLE;
}
</pre></div>
<div class="crlf1"></div>
MEINE_VARIABLE hat nach wie vor den Inhalt 10. Wenn man die Verrenkungen mit den Definitionen
 erst einmal hinter sich hat, ist das Ganze nur noch einfach kompliziert... ;)
</div>
<div class="crlf2"></div>
&#160;&#160;&#160;<a href="index.htm"><img src="../../../../pics/nav_up.png" alt="aufw&auml;rts" width="20" height="20" border="0" title="aufw&auml;rts" /></a>
&#160;&#160;&#160;<a href="0200.htm"><img src="../../../../pics/nav_bk.png" alt="zur&uuml;ck" width="20" height="20" border="0" title="zur&uuml;ck" /></a>
&#160;&#160;&#160;<a href="0400.htm"><img src="../../../../pics/nav_fw.png" alt="vorw&auml;rts" width="20" height="20" border="0" title="vorw&auml;rts" /></a>
<div class="crlf1"></div>
</body>
</html>
